class: inverse,left, middle background-image: url(data:image/png;base64,#background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ## Módulo 1: Manipulación y análisis de datos geoespaciales ###Introducción a Tidyverse José A. Lastra<br> <a href="http://github.com/JoseLastra"> Github: JoseLastra</a><br> <a href="mailto:jose.lastra@pucv.cl"> jose.lastra@pucv.cl</a> | <a href="mailto:jose.lastramunoz@wur.nl"> jose.lastramunoz@wur.nl</a><br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Septiembre, 2025</b>] <br> --- class: center,middle background-image: url(data:image/png;base64,#labgrs_logo.png) background-size: 35% --- ## Contenidos .pull-left[ 1) Tidyverse: <details> <summary>Detalles</summary> * ¿Qué es? * ¿Qué paquetes contiene? * ¿Por qué usar tidyverse? * Tidydata * Guía de estilo * Pipe `%>%` </details> 2) Importando datos 3) Manipulación 4) Visualización ] .pull-right[ <img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/r_rollercoaster.png" width="650px"/> ] --- ## Bienvenidos al Tidyverse -- ### ¿Qué es tidyverse? -- - Es una colección de paquetes de R, que comparten una filosofía de alto nivel y una grámatica de programación y estructura de datos simple. -- - Esto busca que aprendendiendo el uso de un paquete en específico, aprender el siguiente se vuelva más fácil. -- - En una definición amplia, __tidyverse__ es un lenguaje para resolver problemas usando programación en R ([Wickham et al., 2019](https://cran.r-project.org/web/packages/tidyverse/vignettes/paper.html)) -- - Tidyverse busca agrupar las tareas más comunes del día a dia: importación, manipulación, visualización y programación. <center><img src="data:image/png;base64,#https://r4ds.hadley.nz/diagrams/data-science/base.png" width="50%"/></center> <center>Wickham, Çetinkaya-Rundel & Grolemund, 2023</center> --- ##¿Qué paquetes contiene tidyverse? -- - Al instalar tidyverse usando [`install.packages(tidyverse)`], podemos revisar los paquetes que posee empleando `tidyverse::tidyverse_packages()` .pull-left[ <table class="table" style="font-size: 16px; color: black; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Paquetes </th> <th style="text-align:left;"> </th> <th style="text-align:left;"> </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> broom </td> <td style="text-align:left;"> haven </td> <td style="text-align:left;"> readr </td> </tr> <tr> <td style="text-align:left;"> conflicted </td> <td style="text-align:left;"> hms </td> <td style="text-align:left;"> readxl </td> </tr> <tr> <td style="text-align:left;"> cli </td> <td style="text-align:left;"> httr </td> <td style="text-align:left;"> reprex </td> </tr> <tr> <td style="text-align:left;"> dbplyr </td> <td style="text-align:left;"> jsonlite </td> <td style="text-align:left;"> rlang </td> </tr> <tr> <td style="text-align:left;"> dplyr </td> <td style="text-align:left;"> lubridate </td> <td style="text-align:left;"> rstudioapi </td> </tr> <tr> <td style="text-align:left;"> dtplyr </td> <td style="text-align:left;"> magrittr </td> <td style="text-align:left;"> rvest </td> </tr> <tr> <td style="text-align:left;"> forcats </td> <td style="text-align:left;"> modelr </td> <td style="text-align:left;"> stringr </td> </tr> <tr> <td style="text-align:left;"> ggplot2 </td> <td style="text-align:left;"> pillar </td> <td style="text-align:left;"> tibble </td> </tr> <tr> <td style="text-align:left;"> googledrive </td> <td style="text-align:left;"> purrr </td> <td style="text-align:left;"> tidyr </td> </tr> <tr> <td style="text-align:left;"> googlesheets4 </td> <td style="text-align:left;"> ragg </td> <td style="text-align:left;"> xml2 </td> </tr> </tbody> </table> ] .pull-right[ - Al cargar tidyverse a nuestro entorno, [`library(tidyverse)`], los siguientes paquetes son importados por defecto: <img src="data:image/png;base64,#core_conflicts.png" width="95%"/> - Los paquetes del "core" de tidyverse son generalmente suficientes para la mayoría de los análisis de datos. ] --- ### ¿Por qué usar tidyverse? -- - Los scripts escritos en estructura __tidyverse__ son en general más simples de escribir, leer y entender facilitando con esto la labor del/la programador/a. -- - Todos los paquetes en el tidyverse funcionan perfectamente juntos, evitando que nos preocupemos de algún tipo de compatibilidad. -- - Busca llegar a una estructura ordenada de nuestros datos, valiéndose para eso del uso de los **tibble**. <center><img src="data:image/png;base64,#tibble.png" width="25%"/></center> <center><a href="https://dcl-prog.stanford.edu/">Altman, Behrman & Wickham, 2021</a></center> --- ## Tidydata -- - La estructura de datos fundamental en tidyverse son los **tibble**. -- - De forma elemental, podríamos definir un tibble como una lista de vectores de la misma longitud. ``` r class(mpg) # revisar la clase de un objeto ``` ``` ## [1] "tbl_df" "tbl" "data.frame" ``` -- - Estructuralmente, se puede pensar en un tibble como una hoja de Excel, una tabla en una base de datos, o como un dataframe en R o Python. --- -- .pull-left[ - Un tibble puede ser creado fácilmente en R empleando la función `tibble()` de **dplyr** ``` r tibble( a = 1:5, b = 6:10, c = 1, z = (a + b)^2 + c ) ``` | a| b| c| z| |--:|--:|--:|---:| | 1| 6| 1| 50| | 2| 7| 1| 82| | 3| 8| 1| 122| | 4| 9| 1| 170| | 5| 10| 1| 226| ] -- .pull-right[ - También podemos usar la función `as_tibble()`, para transformar objetos a tibble como por ejemplo el data.frame **trees**<sup>*</sup> disponible en R. ``` r as_tibble(trees) ``` | Girth| Height| Volume| |-----:|------:|------:| | 8.3| 70| 10.3| | 8.6| 65| 10.3| | 8.8| 63| 10.2| | 10.5| 72| 16.4| | 10.7| 81| 18.8| | 10.8| 83| 19.7| ] .footnote[ *Ryan, T. A., Joiner, B. L. and Ryan, B. F. (1976) The Minitab Student Handbook. Duxbury Press. ] --- ## Tidydata -- - La idea general del trabajo con tibble es mantener una estructura ordenada (**tidy**) y rectangular, ya sea ancha o larga. -- - Esto implica invertir tiempo ordenando y limpiando nuestros datos (~80% del tiempo). -- - Para que un set de datos sea se ordenado, hay 3 reglas generales (Wickham, Çetinkaya-Rundel & Grolemund, 2023): * Cada variable debe tener su propia columna * Cada observación debe tener su propia fila * Cada valor debe tener su propia celda <center><img src="data:image/png;base64,#tidy-1.png" width="75%"/></center> <center><a href="https://r4ds.had.co.nz/tidy-data.html">Wickham, Çetinkaya-Rundel & Grolemund, 2023</a></center> --- name: untidy-slide ## Tidydata .center[**¿Cuál de estas 2 tablas cumple con las 3 reglas?**] .pull-left[ |country | year| cases| population| |:-----------|----:|------:|----------:| |Afghanistan | 1999| 745| 19987071| |Afghanistan | 2000| 2666| 20595360| |Brazil | 1999| 37737| 172006362| |Brazil | 2000| 80488| 174504898| |China | 1999| 212258| 1272915272| |China | 2000| 213766| 1280428583| ] .pull-right[ |country | year|type | count| |:-----------|----:|:----------|---------:| |Afghanistan | 1999|cases | 745| |Afghanistan | 1999|population | 19987071| |Afghanistan | 2000|cases | 2666| |Afghanistan | 2000|population | 20595360| |Brazil | 1999|cases | 37737| |Brazil | 1999|population | 172006362| ] --- <center><img src="data:image/png;base64,#tidy-4.png" width="60%"/></center> <center><img src="data:image/png;base64,#tidy-5.png" width="60%"/></center> <center><a href="https://garrettgman.github.io/tidying/">Grolemund, 2016</a></center> -- - El uso de datos ordenados favorece la uniformidad al tener una estructura de datos consistente. -- - Además, almacenar las variables en columnas favorece la naturaleza vectorial de R. --- ## Guía de estilo -- - En R no existe una guía universal de sintaxis para el desarrollo de un script. -- - Sin embargo, es recomendable trabajar de forma homogénea, uniforme y legible. -- - Tidyverse tiene un guía propia que pueden visitar [**aquí**](https://style.tidyverse.org/) y además disponemos de librerías como [**styler**](https://CRAN.R-project.org/package=styler) que nos ayudan a mejorar el estilo de nuestros scripts. -- - Nuestras recomendaciones generales son las siguientes: * Evite las líneas de código muy largas (> 80 caracteres). * Use espacios después de las comas. * Los operadores (==, +, <-, %>%, etc.) deben tener un espacio antes y después. * No poner espacios entre el nombre de una función y el primer paréntesis, ni tampoco entre el último argumento de la función. * Evite usar nombres de funciones o variables que ya existen (c <- 10, c()). * Evite el uso de caracteres especiales en nombres de objetos, archivos o rutas. * Use una sola estructura para los nombres de los objetos. > Un buen estilo de programación es como una buena puntuación, se puede escribir sin ella pero ... esmásfácilleeralgoordenadoquealgoquenoloestá. Hadley Wickham --- <center><img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/tidydata_7.jpg" width="90%"/></center> <center>©Allison Horst</center> --- ## Pipe `%>%` -- - Una herramienta que facilita el trabajo con datos en R viene de la mano del paquete [**magrittr**](https://CRAN.R-project.org/package=magrittr). -- - El uso de los pipes nos permite expresar de forma clara una secuencia de múltiples operaciones. -- - Además, nos permite combinar estas funciones sin tener que asignar los valores intermedios a un objeto de forma innecesaria. -- - Tidyverse importa automáticamente `%>%` para su uso. - Desde R 4.1.0 se introdujo una versión nativa de pipe `|>`, puede ver más información [__aquí__](https://www.tidyverse.org/blog/2023/04/base-vs-magrittr-pipe/) -- ``` r set.seed(123) # asegurar reproducibilidad a <- runif(n = 500, min = 0, max = 10000) # calculemos el promedio de nuestro vector ## convencional mean(a) ``` ``` ## [1] 4952.837 ``` ``` r ## tidy a %>% mean() ``` ``` ## [1] 4952.837 ``` --- ## Pipe `%>%` ``` r # Encadenando procesos ## convencional prod(round(mean(a)), 5) ``` ``` ## [1] 24765 ``` ``` r ## tidy a %>% mean() %>% # promedio del vector round() %>% # redondeo del promedio prod(5) # multiplicado ``` ``` ## [1] 24765 ``` -- - En la estructura convencional, el código se lee desde adentro hacia afuera. -- - En la estrutura ordenada, podemos leer una secuencia ordenada de procesos. --- ## Pipe `%>%` -- - Además de aplicar los procesos encadenados, podemos referenciar un set de datos empleando el "." dentro de un argumento de una función. -- - Tomemos la función `lm()` como ejemplo, donde debemos indicar como primer argumento una fórmula y luego la tabla de donde provienen las variables a utilizar. -- - Usemos el set de datos ToothGrowth<sup>*</sup> que viene en R ``` r # convencional lm(len ~ dose, data = ToothGrowth) ``` ``` ## ## Call: ## lm(formula = len ~ dose, data = ToothGrowth) ## ## Coefficients: ## (Intercept) dose ## 7.422 9.764 ``` .footnote[ *C. I. Bliss (1952). The Statistics of Bioassay. Academic Press. ] --- ``` r # tidy ToothGrowth %>% lm(len ~ dose, data = .) ``` ``` ## ## Call: ## lm(formula = len ~ dose, data = .) ## ## Coefficients: ## (Intercept) dose ## 7.422 9.764 ``` -- - Podemos ver como referenciamos al dataset ToothGrowth en la función `lm` con el argumento `data = .` --- ## Importando datos -- - Dentro de tidyverse disponemos de diferentes funciones de lectura de datos que provienen directamente del paquete [**readr**](https://CRAN.R-project.org/package=readr). -- - Las funciones más comunes para la lectura de archivos delimitados son: |Función |Uso | |:------------------------|:-------------------------------------------------------------| |read_csv() ó read_csv2() |lectura de archivos separados por "," y ";" | |read_delim() |lectura de archivos generales (cualquier tipo de delimitador) | |read_table() |lectura de archivos separados por espacios | -- - Existen funciones adicionales como **read_tsv()** o **read_fwf()**, para archivos separados por tabulación y archivos de ancho fijo respectivamente. -- - A continuación, veremos como importar datos desde diferentes fuentes comunes de datos para posteriormente manipularlos empleando el set de herramientas de tidyverse. --- ## Importando datos -- - Es importante tener presente que, la importación de archivos también la podemos hacer de forma interactiva en la pestaña de entorno de RStudio. <center><img src="data:image/png;base64,#import-1.png" width="60%"/></center> --- ## Importando datos .center[**¿Por qué no usar solo las funiones de base como read.csv?**] -- - Las funciones de lectura son en general hasta 10 veces más rápidas que las funciones de base. - Permiten el uso de múltiples núcleos para la apertura de archivos. - Las tareas pesadas disponen de una barra de progreso, lo que permite saber que está pasando en la lectura del archivo. - Generan tibbles por defecto, no convierten las columnas con caracteres en factores, ni generan otros errores comunes en las funciones de base. - Garantizan mayor reproducibilidad del código. --- ## Importando datos -- - **CSV**: Para este ejemplo de importación de datos, localice el archivo de nombre **Sismos.csv** en su directorio. ``` r sismos <- read_csv(file = "Sismos.csv") ```
-- - Podríamos haber leído el archivo on **read_csv2()** si fuera CSV separado "**;**" con **read_delim()** para otros delimitadores. --- ``` r sismos_del <- read_delim(file = "Sismos.csv", delim = ",") ```
``` r # revisando all.equal(sismos, sismos_del) ``` ``` ## [1] TRUE ``` --- ## Importando datos -- - **CSV remoto**: Defunciones COVID-19 año 2023 Departamento de estadística e información de Salud DEIS [(**Sitio con todos los datos**)](https://datos.gob.cl/dataset/defunciones-por-covid19) ``` r url_covid <- "https://raw.githubusercontent.com/labGRS/labGRS.github.io/main/DIPGRS_2024/MOD_1/UN_1/data_aux/COVID-19_defunciones_2023.csv" covid_data <- read_csv(url_covid) ```
--- ## Importando datos -- - Junto con los archivos CSV, las hojas de cálculo de Microsoft Excel son uno de las formas de trabajar datos más comunes. -- - Los formatos XLS y XLSX, pueden ser importados con el paquete [**readxl**](https://CRAN.R-project.org/package=readxl) -- - **readxl** se instala al instalar tidyverse, pero debe ser cargado explícitamente o llamado usando `readxl::`, ya que no forma parte de los paquetes núcleo. -- - **Excel**: Inventario de Glaciares Versión 1 ([DGA, 2022](https://dga.mop.gob.cl/Paginas/InventarioGlaciares.aspx)) ``` r glaciares <- readxl::read_xlsx("IPG_2022_v1.xlsx") ``` ---
-- - De forma complementaria, el paquete [**writexl**](https://CRAN.R-project.org/package=writexl), nos permite guardar en disco archivos XLSX. --- ## Manipulación -- - Como hemos mencionado, tidyverse nos entrega herramientas para los procesos principales del trabajo con información alfanumérica. -- - Dentro de las principales funciones, podemos considerar: - Manipulación de caracteres con [**stringr**](https://CRAN.R-project.org/package=stringr) - Manipulación de fechas y tiempo con [**lubridate**](https://CRAN.R-project.org/package=lubridate) - Manipulación tabular con [**dplyr**](https://CRAN.R-project.org/package=dplyr) -- - Es común emplear las herramientas de forma combinada, en función de los niveles de manipulación de los datos a trabajar y la necesidad de alterarlos para nuestros resultados. --- ## Manipulación -- - Existen otros paquetes que permiten trabajar sobre otros objetos y outputs como por ejemplo: * [**tidyr**](https://CRAN.R-project.org/package=tidyr) que permite cambiar la forma y jerarquía de un set de datos, para facilitar la estructura ordenada predilecta de tidyverse. * [**broom**](https://CRAN.R-project.org/package=broom) permite convertir a tibble salidas de funciones como lm(), nls() o glm(). * [**forcats**](https://CRAN.R-project.org/package=forcats) facilita el uso de factores para trabajar con variables categóricas. * Entre otros paquetes y funciones. <center><img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/tidydata_4.jpg" width="40%"/></center> <center>©Allison Horst</center> --- ## Manipulación -- - **Selección de columnas**: al igual que otros objetos en R, podemos hacer uso de los `[]` para seleccionar variables y observaciones dentro de un tibble. -- - El paquete **dplyr** nos proporciona la función **select()** para elegir columnas de interés dentro de nuestros datos ``` r # Seleccion de columnas covid_data %>% select(AÑO, FECHA_DEF, SEXO_NOMBRE, EDAD_TIPO, EDAD_CANT, COMUNA, NOMBRE_REGION, LUGAR_DEFUNCION) ```
-- - Si tenemos columnas con espacios en el nombre, debe ser colocada con el símbolo de acento grave al momento de utilizar `select()` u otra función. --- ## Manipulación -- - Además de la selección de columnas, **select()** nos permite modificar el orden y el nombre de las columnas de salida en nuestro nuevo objeto. ``` r covid_new <- covid_data %>% select(NOMBRE_REGION, COMUNA, AÑO, FECHA_DEF, LUGAR_DEFUNCION, SEXO = SEXO_NOMBRE, CLASE_EDAD = EDAD_TIPO, EDAD_REAL = EDAD_CANT ) ```
-- - El renombre de columnas también puede realizarse con la función `rename()`. --- ## Manipulación -- - Con **select()** también podemos remover columnas que no queramos en nuestro set de datos, agregando un **"-"** en la/as columnas a eliminar ``` r covid_data %>% select(-AÑO, -DIAG1) ```
--- ## Manipulación -- - **Cambio de forma**: otra manipulación común es el cambio de forma de nuestro objeto, donde adaptamos su estructura a wide o long dependiendo de los requerimientos: graficar, resumir información, etc. -- - El paquete **tidyr**, proporciona dos funciones para el paso de wide-to-long y long-to-wide: `pivot_longer()` y `pivot_wider()`. -- - En general, los datos que trabajamos suelen venir en formato wide (muchas columnas), por lo que el uso de **pivot_longer()** es más recurrente que el de **pivot_wider()** -- - Tomemos como ejemplo la segunda tabla de [**este slide**](#untidy-slide), que representa una tabla con una estructura no ordenada<sup>*</sup>. --
.footnote[ <sup>*</sup> World Health Organization Global Tuberculosis Report. Paquete tidyr ] --- -- ``` r table2_wide <- table2 %>% pivot_wider(names_from = type, values_from = count) ```
<center><img src="data:image/png;base64,#tidy-8.png" width="45%"/></center> <center><a href = 'https://tidyr.tidyverse.org/'>tidyr cheatsheet, 2023</a></center> --- ## Manipulación -- - Para ver el la aplicación **pivot_longer()**, usaremos la tabla de nombre **Temperatura_series.csv**, que se generó en la clase de Introducción a R [**Sección Ciclos**](https://labgrs.github.io/DIPGRS_2024/MOD_1/UN_1/DIPGEOPR_01_1.html#127). ``` r temperatura <- read_csv("Temperatura_series.csv") ```
--- class: middle <center><img src="data:image/png;base64,#tidy-9.png" width="80%"/></center> <center><a href = 'https://tidyr.tidyverse.org/'>tidyr cheatsheet, 2023</a></center> --- -- - Modificaremos la estructura de nuestra tabla, para poder generar un nuevo tibble que nos permita construir boxplots para comparar la temperatura entre sitios, por mes y por año. ``` r temperatura_long <- temperatura %>% # Indicamos que columnas no seran puestas en el nuevo campo pivot_longer(cols = !c(Date, Year, Month)) ```
--- ``` r ## comparacion temperatura por sitios temperatura_long %>% boxplot(value ~ name, data = ., xlab = "", ylab = "[°C]", las = 2, cex.axis = 0.8, main = "Boxplot temperatura media por sitio") ``` <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-36-1.png" width="100%" /> --- ``` r ## comparacion temperatura por mes temperatura_long %>% boxplot(value ~ Month, data = ., main = "Boxplot temperatura media por mes", xlab = "", ylab = "[°C]") ``` <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-37-1.png" width="100%" /> --- ``` r ## comparacion temperatura por año temperatura_long %>% boxplot(value ~ Year, data = ., main = "Boxplot temperatura media por año", xlab = "", ylab = "[°C]", las = 2, cex.axis = 0.8) ``` <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-38-1.png" width="100%" /> --- ## Manipulación -- - **Filtro de información**: El paquete **dplyr** dispone de la función **filter()**, que nos permite filtrar filas de información que cumplan 1 o más criterios en base a la información dispuesta en nuestros datos. -- - Tomemos como ejemplo la tabla con datos de defunciones por COVID-19 2023. ``` r ## Registros que disponen edad en años covid_data %>% filter(EDAD_TIPO == 1) ```
--- -- ``` r ## Registros que disponen edad en años y menores de 30 covid_data %>% filter(EDAD_TIPO == 1, EDAD_CANT < 30) ```
-- - En las funciones de filtro podemos emplear cualquiera de los operadores de relación o lógicos. --- ## Manipulación -- - **Creando nueva información**: dplyr nos proporciona funciones para agregar información a una tabla existente, agrupar y generar resúmenes de información. -- - Estas funciones son principalmente: `mutate()`, `group_by()` y `summarise()` ``` r ## agregar nueva columna con meses covid_data <- covid_data %>% mutate(MES = lubridate::month(FECHA_DEF)) ```
-- - `mutate()` permite agregar columnas realizando cálculos con datos provenientes del mismo set de datos o vectores externos con la misma longitud de la tabla. --- -- - Normalmente, las funciones `group_by()` y `summarise()` -- - Calculemos el porcentaje total de defunciones por region. -- ``` r covid_region <- covid_data %>% group_by(NOMBRE_REGION) %>% # agrupar por region summarise( COUNT_REG = n(), # calcular numero de defunciones PERCENT_REG = (COUNT_REG * 100) / nrow(.) ) # calculo de porcentaje ```
-- - La agrupación puede ser realizada con más de un campo categórico en caso de ser necesario. --- ## Manipulación -- - **Unión de tablas**: Unir datos desde diferentes fuentes empleando un código de vinculación en común, es una tarea recurrente para la cual **dplyr** nos es de gran utilidad. -- - R base dispone de `merge()` para realizar las uniones. Mientras que **dplyr** individualiza los tipos de unión con funciones como `inner_join()`, `left_join()`, `right_join()`, `full_join()`, etc. -- - **inner_join()** es el tipo de unión más común, generando un nuevo objeto con los valores coincidentes en base al campo de unión seleccionado. -- - <center><img src="data:image/png;base64,#https://r4ds.hadley.nz/diagrams/join/venn.png" width="80%"/></center> <center><a href = 'https://r4ds.had.co.nz/relational-data.html'>Wickham, Cetinkaya-Rundel & Grolemund, 2023</a></center> --- ## Manipulación -- - Trabajaremos con nuestros datos de covid, y leeremos la tabla de nombre **Total_establecimientos_salud.csv**. -- ``` r total_est <- read_csv("Total_establecimientos_salud.csv") ```
-- - Crearemos un objeto llamado __covid_com__, que tenga el número de defunciones totales por comuna. - Uniremos la información coincidente entre ambas tablas considerando el código de comuna disponible en ambas utilizando **inner_join()** --- -- ``` r covid_com <- covid_data %>% group_by(COD_COMUNA, COMUNA) %>% summarise(TOTAL_DEF = n()) ## Union de datos entre tablas covid_data_inner <- inner_join( x = covid_com, # datos base y = total_est, # datos a vincular by = join_by("COD_COMUNA" == "COD_COM") # campos de union ) ```
-- - Un aspecto a considerar es el nombre de la columna común en ambas tablas. -- - Si tienen el mismo nombre, la unión es directa, pero si el nombre es diferente, tenemos que usar la función `join_by()`. --- ## Visualización -- - Luego del orden y manipulación de nuestros datos, un aspecto relevante es la visualización de la información. -- - Tidyverse incorpora en su core de paquetes a [**ggplot2**](https://CRAN.R-project.org/package=ggplot2), que está basado en la *Gramática de Gráficos* (Wilkinson, 2005) y que permite visualizar datos uni o pluridimensionales. -- - **ggplot2** dispone de una estructura donde cada componente va ordenado a modo de capas, acorde a la disposición deseada para el gráfico final. -- - Esta disposición por capas de **ggplot2**, fue propuesta por [Wickham (2007)](https://doi.org/10.1198/jcgs.2009.07098) como modificación a la estructura de Wilkinson. .pull-left[ <center><img src="data:image/png;base64,#GOG.png" width="90%"/></center> <center><a href = 'https://r-unimelb.gitbook.io/rbook/putting-the-r-in-art/ggplot2-and-the-grammar-of-graphics'>Melbourne University, 2022</a></center> ] .pull-right[ <center><img src="data:image/png;base64,#GOG2.png" width="40%"/></center> <center>Wickham, 2007</center> ] --- class: middle <center><img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/ggplot2_masterpiece.png" width="70%"/></center> <center>©Allison Horst</center> --- ## Visualización -- - Para introducir la visualización de datos con ggplot2, utilizaremos el Inventario Público de Glaciares (DGA, 2022) leído en la sección de importación de datos (Nombre de archivo: **IPG_2022_v1.xlsx**). ``` r glaciares <- readxl::read_excel("IPG_2022_v1.xlsx") ```
--- ## Visualización -- - Un código base consite en la generación del canvas: * Indicar nuestro set de datos (tibble o data frame de preferencia) * Indicar el aestethic a graficar ``` r ggplot(data = glaciares, aes(x = PENDIENTE, y = ESP_MED)) ``` <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-53-1.png" width="100%" style="display: block; margin: auto;" /> --- -- - A continuación, debemos indicar el tipo de elemento a graficar (puntos, líneas, barras, etc.) -- - **Importante**: veremos muchas más alternativas más adelante, pero un buen lugar para indagar es [**R Graph Gallery**](https://www.r-graph-gallery.com/) -- ``` r ggplot(data = glaciares, aes(x = PENDIENTE, y = ESP_MED)) + geom_point() ``` <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-54-1.png" width="100%" style="display: block; margin: auto;" /> --- ## Visualización -- - Al estar gran parte de nuestra información en un tibble, podemos disponer de todas las columnas para agregar información y poder explorar diferentes dimensiones de los datos. ``` r # diferencias de espesor entre tipos de glaciares on boxplots ggplot( data = glaciares, aes(x = CLASIFICA, y = ESP_MED) ) + geom_boxplot() ``` --- class: middle <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-56-1.png" width="100%" style="display: block; margin: auto;" /> --- -- - Si queremos, podemos dividir nuestros gráficos para ver la información por categorías utilizando `facet_wrap()` ``` r ggplot(data = glaciares, aes(x = PENDIENTE, y = ESP_MED)) + geom_point() + facet_wrap(~CLASIFICA) ``` <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-57-1.png" width="100%" style="display: block; margin: auto;" /> -- - Podemos incorporar dimensiones adicionales a nuestros gráficos o modificar aspectos estéticos como los ejes del gráfico. --- ``` r ## Mejorando el gráfico ggplot(data = glaciares, aes(x = PENDIENTE, y = ESP_MED, color = HMEDIA)) + geom_point() + facet_wrap(~CLASIFICA) + xlab("Pendiente en grados") + ylab("Espesor Medio [m]") ``` <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-58-1.png" width="100%" style="display: block; margin: auto;" /> -- - Como se puede apreciar **ggplot2** es bastante intuitivo en la nomenclatura de las formas disponibles, por ejemplo: para puntos usamos `geom_point()`, para líneas `geom_line()`, para barras `geom_bar()`, etc. --- ## Ejercicio -- - Combinando lo revisado en esta clase y empleando la información del Inventario Público de Glaciares (DGA, 2022): a) Calculemos el número total de glaciares por tipo b) Calculemos el número total de glaciares por región y tipo c) Calculemos el volumen glaciar total por región y tipo. Grafiquemos los resultados --- ## Soluciones -- a) Total de glaciares por tipo: ``` r total_tipo <- glaciares %>% group_by(CLASIFICA) %>% summarise(TOTAL = n()) ``` |CLASIFICA | TOTAL| |:------------------|-----:| |GLACIAR DE MONTAÑA | 3843| |GLACIAR DE VALLE | 310| |GLACIAR EFLUENTE | 217| |GLACIAR ROCOSO | 3586| |GLACIARETE | 18213| --- -- b) Total por región y por tipo ``` r tipo_reg <- glaciares %>% group_by(REGIÓN, CLASIFICA) %>% summarise(TOTAL = n()) ```
--- -- - c) Volumen total por región ``` r volumen_reg <- glaciares %>% group_by(REGIÓN, CLASIFICA) %>% summarise(VOL_km3 = sum(VOL_km3, na.rm = T)) ```
--- -- - Armemos un ódigo simple donde podamos visualizar las 3 dimensiones de información: * Volumen * Región * Tipo de glaciar -- ``` r volumen_reg %>% ggplot(aes(x = REGIÓN, y = VOL_km3)) + geom_bar(stat = "identity") + facet_wrap(~CLASIFICA) + labs(x = "", y = expression(paste("Volumen ", km^{ 3 }))) + coord_flip() ``` --- -- <img src="data:image/png;base64,#DIPGEOPR_01_2_files/figure-html/unnamed-chunk-66-1.png" width="100%" /> --- class: middle 